﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AgendaManager.AgendaService;

namespace AgendaManager
{
    public partial class frmSeleccionObra : Form
    {
        //ToDo: Borrar
        //AgendaService.Service1 ws = new AgendaService.Service1();

        public Obra Obra { get; set; }
        public ObraContacto ObraContacto { get; set; }
        public string NombreContacto { get; set; }
        public bool isContact { get; set; }

        private List<Obra> Obras { get; set; }

        private List<Pais> Paises = new List<Pais>();
        private List<Provincia> Provincias = new List<Provincia>();
        private List<Empresa> Empresas = new List<Empresa>();

        public frmSeleccionObra()
        {
            InitializeComponent();
        }

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {
            if (gvObras.SelectedRows.Count == 1)
            {
                Obra = Obras.Find(x => x.Id == (int)gvObras.SelectedRows[0].Cells["Id"].Value);

                if (isContact)
                {
                    if (NombreContacto != null || NombreContacto != string.Empty)
                    {
                        using (frmObraContacto f = new frmObraContacto())
                        {
                            f.NombreContacto = NombreContacto;
                            f.NombreObra = Obra.Nombre;

                            if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                ObraContacto.Telefono = f.ObraContacto.Telefono;
                            else
                                ObraContacto.Telefono = "";
                        }
                    }

                    this.DialogResult = System.Windows.Forms.DialogResult.OK;
                    this.Close();
                }
                else
                {
                    //frmNuevaObra f = new frmNuevaObra();
                    //f.StartPosition = FormStartPosition.CenterScreen;
                    //f.Obra = Obra;
                    //f.Show();
                    //FormsHelper.EsMaximizable = false;
                    var f = FormsHelper.ShowForm<frmNuevaObra>();
                    f.SetValues(Obra);
                }
                
                
            }
            else
            {
                MessageBox.Show("Seleccione una sola Obra por favor.",
                            "Selección de Obra.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Exclamation);
            }
        }

        private void frmSeleccionObra_Load(object sender, EventArgs e)
        {
            Paises = ConnectHelper.ws.RetrieveEntities(new Pais(), "").Cast<Pais>().ToList();
            Provincias = ConnectHelper.ws.RetrieveEntities(new Provincia(), "").Cast<Provincia>().ToList();
            Empresas = ConnectHelper.ws.RetrieveEntities(new Empresa(), "").Cast<Empresa>().ToList();

            Obra = new Obra();
            Obras = ConnectHelper.ws.RetrieveEntities(Obra, "").Cast<Obra>().ToList();

            var gvJoin = from obras in Obras
                         select new
                         {
                             Id = obras.Id,
                             Nombre = obras.Nombre,
                             NumeroContrato = obras.NumeroContrato,
                             TipoObra = obras.TipoObra,
                             Prestador = obras.Prestador,
                             Pais = obras.IdPais != null ? Paises.Find(x => x.Id == obras.IdPais).Nombre : "",
                             Provincia = obras.IdProvincia != null ? Provincias.Find(x => x.Id == obras.IdProvincia).Nombre : "",
                             Ciudad = obras.Ciudad,
                             EmpresaConstructora = obras.EmpresaConstructora != null ? Empresas.Find(x => x.Id == obras.EmpresaConstructora).RazonSocial : "",
                             SubContratista = obras.SubContratista != null ? Empresas.Find(x => x.Id == obras.SubContratista).RazonSocial : "",
                             Comitente = obras.Comitente != null ? Empresas.Find(x => x.Id == obras.Comitente).RazonSocial : "",
                             Inspeccion = obras.Inspeccion != null ? Empresas.Find(x => x.Id == obras.Inspeccion).RazonSocial : "",
                             Moneda = obras.Moneda,
                             Monto = obras.Monto
                         };
            
            
            //var gvJoin = from obras in Obras
            //             join obrasPaises in Paises.DefaultIfEmpty()
            //             on obras.IdPais equals obrasPaises.Id into oP
            //             join obrasProvincia in Provincias.DefaultIfEmpty()
            //             on obras.IdProvincia equals obrasProvincia.Id
            //             join comitente in Empresas.DefaultIfEmpty()
            //             on obras.Comitente equals comitente.Id
            //             join empConstructora in Empresas.DefaultIfEmpty()
            //             on obras.EmpresaConstructora equals empConstructora.Id
            //             join inspeccion in Empresas.DefaultIfEmpty()
            //             on obras.Inspeccion equals inspeccion.Id
            //             join subcontratista in Empresas.DefaultIfEmpty()
            //             on obras.SubContratista equals subcontratista.Id
            //             select new
            //             {
            //                 Id = obras.Id,
            //                 Nombre = obras.Nombre,
            //                 NumeroContrato = obras.NumeroContrato,
            //                 TipoObra = obras.TipoObra,
            //                 Prestador = obras.Prestador,
            //                 Pais = oP != null ? obraspai.Nombre : "",
            //                 Provincia = obrasProvincia != null ? obrasProvincia.Nombre : "",
            //                 Ciudad = obras.Ciudad,
            //                 EmpresaConstructora = empConstructora != null ? empConstructora.RazonSocial : "",
            //                 SubContratista = subcontratista != null ? subcontratista.RazonSocial : "",
            //                 Comitente = comitente != null ? comitente.RazonSocial : "",
            //                 Inspeccion = inspeccion != null ? inspeccion.RazonSocial : "",
            //                 Moneda = obras.Moneda,
            //                 Monto = obras.Monto,
            //             };

            gvObras.DataSource = gvJoin.ToList();
            gvObras.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            gvObras.Columns["Id"].Visible = false;

            ObraContacto = new ObraContacto();
        }

        private void txFiltro_TextChanged(object sender, EventArgs e)
        {
            string filter = txFiltro.Text.ToLower();

            gvObras.DataSource = null;

            var gvJoin = from obras in Obras
                         select new
                         {
                             Id = obras.Id,
                             Nombre = obras.Nombre,
                             NumeroContrato = obras.NumeroContrato,
                             TipoObra = obras.TipoObra,
                             Prestador = obras.Prestador,
                             Pais = obras.IdPais != null ? Paises.Find(x => x.Id == obras.IdPais).Nombre : "",
                             Provincia = obras.IdProvincia != null ? Provincias.Find(x => x.Id == obras.IdProvincia).Nombre : "",
                             Ciudad = obras.Ciudad,
                             EmpresaConstructora = obras.EmpresaConstructora != null ? Empresas.Find(x => x.Id == obras.EmpresaConstructora).RazonSocial : "",
                             SubContratista = obras.SubContratista != null ? Empresas.Find(x => x.Id == obras.SubContratista).RazonSocial : "",
                             Comitente = obras.Comitente != null ? Empresas.Find(x => x.Id == obras.Comitente).RazonSocial : "",
                             Inspeccion = obras.Inspeccion != null ? Empresas.Find(x => x.Id == obras.Inspeccion).RazonSocial : "",
                             Moneda = obras.Moneda,
                             Monto = obras.Monto
                         };

            if (filter != string.Empty)
            {
                var aux = gvJoin.Where(x => x.Nombre.ToLower().Contains(filter)
                    || x.NumeroContrato.ToLower().Contains(filter)
                    || x.TipoObra.ToLower().Contains(filter)
                    || x.Prestador.ToLower().Contains(filter)
                    || x.Pais.ToLower().Contains(filter)
                    || x.Provincia.ToLower().Contains(filter)
                    || x.Ciudad.ToLower().Contains(filter)
                    || x.EmpresaConstructora.ToLower().Contains(filter)
                    || x.SubContratista.ToLower().Contains(filter)
                    || x.Comitente.ToLower().Contains(filter)
                    || x.Inspeccion.ToLower().Contains(filter));

                gvObras.DataSource = aux.ToList();
                gvObras.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                gvObras.Columns["Id"].Visible = false;
            }
            else
            {
                gvObras.DataSource = gvJoin.ToList();
                gvObras.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                gvObras.Columns["Id"].Visible = false;
            }
            
        }

        private void btnNuevaObra_Click(object sender, EventArgs e)
        {
            using (frmNuevaObra f = new frmNuevaObra())
            {
                f.ShowDialog();
                Obras = ConnectHelper.ws.RetrieveEntities(Obra, "").Cast<Obra>().ToList();

                gvObras.DataSource = Obras;
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.Close();
        }

        
    }
}
